/*
* leetcode	17. 电话号码的字母组合
* 给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
* 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
* */

const comb = (arr) => {
	return arr.reduce((acc, cur) => {
		let lenI = acc.length
		let lenJ = cur.length
		const tmp = []

		for (let i = 0; i < lenI; i++) {
			for (let j = 0; j < lenJ; j++) {
				tmp.push(acc[i] + cur[j])
			}
		}

		return tmp
	})
}

export const letterCombinations = (str) => {
	// 过滤 0 和 1
	const digitsArr = str.split('').filter((item) => {
		return item !== '1' || item !== '0'
	})

	// 数字字符串为空，直接返回空数组
	if (digitsArr.length === 0) {
	  return []
	}
	const phoneMap = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
	const codeArr = []

	// 数字字符串长度为1，直接分割
	if (digitsArr.length === 1) {
	  return phoneMap[digitsArr].split('')
	}

	digitsArr.forEach((num) => {
		codeArr.push(phoneMap[num])
	})

	return comb(codeArr)
}

